home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / PERL / Perl / ReadMeArc < prev   
Text File  |  1991-12-14  |  15KB  |  406 lines

  1.                   Archimedes Perl, Release 1.00 Notes
  2.           -----------------------------------
  3.  
  4. This port of the Perl language was produced by Paul Moore, July 1990.
  5.  
  6. I can be reached at:
  7.  
  8. E-Mail: pmoore@cix.compulink.co.uk
  9.  
  10. Mail:    10, Mulberry Rise
  11.     Firdale Park,
  12.     Northwich,
  13.     Cheshire
  14.     CW8 4UQ
  15.  
  16. I am interested in hearing from any perl users who have found bugs in
  17. this implementation of perl. Also, if you have any examples of useful
  18. perl scripts, let me know and I will incorporate them into the
  19. "Examples" directory (with due credit, of course).
  20.  
  21. This port of perl is based on the Unix version of perl, developed and
  22. distributed by Larry Wall (see the Readme file). Unix perl is covered
  23. by the Gnu General Public License (see file Copying), and hence this
  24. port is also so covered. Note that this distribution omits a lot of
  25. Unix specific stuff from the original distribution. If you wish to
  26. obtain a copy of the original (unported) distribution,  send me a
  27. FORMATTED 800k disk and return postage, and I will supply a copy.  Note
  28. that the distribution is archived using David Pilling's !Spark, version
  29. 2.0. If you do not have a suitable extract program (!Spark, or one of
  30. the later versions of !SparkPlug), let me know and include an extra
  31. disk, and I will supply !SparkPlug also.
  32.  
  33. To recompile perl from the sources, you will need a copy of my "Utils"
  34. library of C routines. This is available from most Archimedes BBSs, or
  35. the Newcastle server, or (if you are desparate) from me - please send a
  36. formatted disk and return postage. You will also require some way of
  37. processing the grammar in Y.Perl. I use a port of bison (the Gnu version
  38. of Yacc). This is available for the Archimedes from David Pilling, on
  39. one of his disks, or from me.
  40.  
  41. Please remember - if you want stuff from me, please send enough disks,
  42. and format them in advance. Also, be prepared for a long wait - I am
  43. not very reliable when it comes to distributing software! (If you need
  44. fast service, a good solution is to send large quantities of money,
  45. porsches, or equivalent negotiable goods :-)
  46.  
  47. This version of perl corresponds to Perl 3.0, patch level 44.
  48.  
  49. If you are interested in Perl, and have access to Usenet, I would
  50. recommend looking at the comp.lang.perl newsgroup. It has loads of
  51. interesting stuff on perl, and the designer, Larry Wall, is a regular
  52. contributor.
  53.  
  54. Also available these days is a book on Perl, called "Programming Perl",
  55. in the Nutshell Handbook series, published by O'Reilley & Associates.
  56. Authors, Larry Wall and Randal L. Schwartz.
  57.  
  58. Archimedes Perl
  59. ===============
  60.  
  61. The Archimedes version of perl is mostly identical to the Unix version.
  62. The documentation comes in three forms. The standard documentation
  63. consists of the troff sources for the reference manual, and is in the
  64. four files Perl_man,{1-4}. Also, there is the directory Tex, which
  65. contains TeX sources for further documentation. There is RefCard, which
  66. is a "Reference Card" for perl (patch level 18, I think), and PerlMan,
  67. which is a version of the full perl manual in Gnu "Texinfo" format.
  68. This is available via FTP from chem.bu.edu, in directory
  69. pub/perl-manual. The version here is the latest I have available
  70. (currently, corresponding to patch level 41). For the latter, you need
  71. texinfo version 2.10 (from the latest Gnu Emacs) - you may need to
  72. fiddle with the file if you are using an earlier version of texinfo.
  73.  
  74. I shall only describe the differences between the standard and
  75. Archimedes versions of Perl here.
  76.  
  77. As perl is a general purpose language, with low-level access to system
  78. functions, it is clearly the low-level stuff that is the least portable,
  79. and hence which has been altered most radically.
  80.  
  81.  
  82. Omitted from Archimedes perl
  83. ----------------------------
  84.  
  85. All Unix OS access functions. Namely,
  86.  
  87. chmod    chown    link    lstat    select    utime    symlink    readlink
  88. binmode    fcntl    fileno    flock    ioctl    pipe    chroot    fork
  89. alarm    times    umask    wait    accept    bind    connect
  90.  
  91. getpeername    getsockname    getsockopt    listen
  92. recv        send        setsockopt    shutdown
  93. socket        socketpair    dump        endpwent
  94. getpwent    getpwnam    getpwuid    setpwent
  95. endgrent    getgrgid    getgrnam    getgrent
  96. setgrent    endhostent    gethostbyname    gethostent
  97. sethostent    endnetent    getnetbyaddr    getnetbyname
  98. getnetent    setnetent    endservent    getservbyname
  99. getservbyport    getservent    setservent    endprotoent
  100. getprotobyname    getprotoent    setprotoent    getprotobynumber
  101. getlogin    getpgrp        getppid        getpriority
  102. setpgrp        setpriority
  103.  
  104. These are not implemented, as there is no Archimedes equivalent.
  105.  
  106. The facility to duplicate a file descriptor, as open(OLDFD,">&FD")
  107. is not supported. An attempt has been made to support duplicating
  108. STDIN/OUT/ERR, but this does not work reliably, and should not be used.
  109. I will attempt to rectify this problem, but RISC OS does not supply a
  110. dup() system call, so any solution will be dodgy at best.
  111.  
  112. Also missing, are the "special variables"
  113.  
  114. $$    The process ID of the current perl process
  115. $< $>    Real and effective User ID
  116. $( $)    Real and effective Group ID
  117.  
  118. The following "special variables" have been added
  119.  
  120. $<    The full pathname of the directory where we started perl
  121. $>    The full pathname of the current directory
  122.  
  123. These were added as there is no "pwd" command on the Archimedes. The
  124. mnemonics in the manual ($< is "where we came from" and $> is "where we
  125. have gone to") are still appropriate.
  126.  
  127. The variable $! does not correspond to errno in Archimedes perl, as
  128. errno very rarely has a useful value. Instead, the last error from the
  129. kernel (_kernel_last_oserror) is stored in $! whenever an OS call
  130. returns an error (eg, opening files, deleting files, creating
  131. directories, syscall(), etc). The dual nature of $! (returning the
  132. error number in a numeric context, and the error message in a string
  133. context) is retained.
  134.  
  135. Also missing are the 'N' and 'n' templates from pack/unpack.
  136.  
  137.  
  138. File tests in Archimedes perl
  139. -----------------------------
  140.  
  141. The file tests
  142.  
  143. -x, -o, -X, -O        File is executable or owned
  144. -l, -S, -p, -b, -c    Special file types
  145. -u, -g, -k        Setuid, setgid, and "sticky"
  146. -M, -C            File time stamps
  147.  
  148. are missing.
  149.  
  150. The following have changed meaning
  151.  
  152. -r            File is readable
  153. -w            File is writeable
  154. -R            File is PUBLICLY readable
  155. -W            File is PUBLICLY writeable
  156. -A            File time stamp ("age")
  157.  
  158. (See the Archimedes manuals for the distinction here - unless you are
  159. using econet, -R and -W are not very useful). Note that RISC OS only
  160. records one time stamp for a file - this is tested using -A.
  161.  
  162. New file test
  163.  
  164. -L            File is locked
  165.  
  166. Also, the tests -B and -T are NOT defined on filehandles. Only on file
  167. names.
  168.  
  169.  
  170. Other changes in Archimedes perl
  171. --------------------------------
  172.  
  173. The return value from the stat() function has changed. Be careful of
  174. this one when porting Unix perl scripts. The new value is an array of 8
  175. elements, as follows
  176.  
  177.     Index        Value
  178.  
  179.     0        Basic file type (r0 on return from OS_File)
  180.     1        File type for timestamped files
  181.     2        Load address
  182.     3        Execution address
  183.     4        File length
  184.     5        File attributes
  185.     6        File timestamp (as centisec past 00:00:00 1/1/1900)
  186.     7        File timestamp (as seconds past 00:00:00 1/1/1970)
  187.  
  188. Note: Index 0 is 0 for "file not found", 1 for a normal file, and 2 for
  189. a directory. Index 5 is a bit set encoding the read/write/locked status
  190. of the file (see the Archimedes manuals for more details). Indexes 6 and
  191. 7 are the same value, in two different forms. The first is the
  192. Archimedes standard "5-byte" time format (all numbers in perl are C
  193. doubles, so there is no loss of precision), and the second is the Unix
  194. standard format.
  195.  
  196. The mkdir() function does not need a second argument (the file mode,
  197. under Unix). Instead, it is a unary operator, like rmdir - for example,
  198.  
  199.     mkdir "C";        # Make directory C
  200.     mkdir("Test");        # Make directory Test
  201.  
  202. Similarly, the syntax of kill() has changed - it takes a single argument
  203. which is a signal number or name, and raises that signal. There is no
  204. list of process IDs - for example,
  205.  
  206.     kill "INT";        # signal ESCAPE
  207.     kill(4);        # also signal ESCAPE (SIGINT is 4)
  208.  
  209. These latter two, particularly mkdir(), are a nuisance when porting, and
  210. can cause subtle bugs. I was undecided for a long time as to whether to
  211. preserve portability at the expense of a "natural" look to Archimedes
  212. users. Finally, however, I decided that I prefer the non-portable, but
  213. more natural, form.
  214.  
  215. There are two new pack/unpack template values. These are to make
  216. conversion of Archimedes standard times easier.
  217.  
  218.     T    This takes the next 5 bytes of the string, and converts
  219.         it to a number as if it were a 5-byte 2's complement
  220.         integer. This is a suitable conversion if the target
  221.         string was an Archimedes 5-byte time. A repeat count
  222.         converts a series of 5-byte numbers.
  223.  
  224.     P    This treats the next 4 bytes of the target string as a
  225.         pointer to a string whose length is given in the repeat
  226.         count.  When unpacking, Pn reads EXACTLY n bytes from the
  227.         string pointed to, into the destination string. This is
  228.         unlike p1, which will stop at a NULL.  As there is no way
  229.         of ensuring in pack() that the argument is exactly n
  230.         bytes long, the P template is not accepted in pack().
  231.  
  232. For example, if $ptr holds a pointer to a 5-byte time (say, from a SWI
  233. call), then
  234.  
  235.     $time = unpack('P5', $ptr);
  236.     $time = unpack('T',$time);
  237.  
  238. will get the time value into $time.
  239.  
  240.  
  241. "File globbing", such as <C.*>, IS supported, but the filename patterns
  242. conform to the normal Archimedes standard (* is any number of
  243. characters, including 0, and # is any single character). This construct
  244. currently requires the program "Glob" to be available in Run$Path. The
  245. source for Glob is supplied with perl.
  246.  
  247.  
  248. Things which DO exist in Archimedes perl
  249. ----------------------------------------
  250.  
  251. The following is a list of things which do exist in Archimedes perl.
  252. They are all documented for Unix perl, but are worth mentioning here,
  253. because they are slightly less "obvious".
  254.  
  255.  
  256. 1. Unix names for familiar functions.
  257.  
  258. The following functions exist, and work as expected. The Unix-style
  259. names have been retained for compatibility.
  260.  
  261.     mkdir        *Cdir
  262.     rmdir        *Delete on a directory
  263.     chdir        *Dir
  264.     unlink        *Remove
  265.  
  266.  
  267. 2. "Standard" facilities unfamiliar on the Archimedes.
  268.  
  269. Pipes have been implemented in Archimedes perl. They are implemented
  270. using temporary files, which are put into the directory <Tmp$Dir>, or
  271. &.Tmp, or the current directory, whichever of these exists (they are
  272. tried in that order).
  273.  
  274. This means that the following perl facilities DO exist
  275.  
  276. * Opening pipes, as open(FH, "Command|") or open(FH, "|Command").
  277. * The 'backtick' operator, `Command`.
  278.  
  279. Note that commands can do IO redirection in one of two forms. The
  280. "built-in" OS commands use the standard "Command { < infile > outfile }"
  281. form, with a bit of post-processing to convert CR/NL line terminators
  282. to NL. Other commands are assumed to support the C v3.0 redirection
  283. format, "Command < infile > outfile". Any command which is not built-in
  284. and yet does not allow C redirection, can be forced to use OS
  285. redirection by adding an initial '%' (which is skipped when executing
  286. the command). So, for example, the Acorn utility LibFile, which does
  287. not use C redirection, can be opened as a pipe via
  288.  
  289.     open(LIB, "%LibFile Lib -l |")
  290.  
  291.  
  292. Associating databases with associative arrays. This has been implemented
  293. using the public domain Gnu dbm package. Unfortunately, while this
  294. works, it is presently VERY slow. I am aiming to improve this, but for
  295. now I really only see it as being present for completeness' sake.
  296.  
  297.  
  298. The %SIG associative array works as documented, and can be used to trap
  299. Escape, by assigning to $SIG{'INT'}.
  300.  
  301.  
  302. 3. The syscall() function.
  303.  
  304. Syscall() has been implemented, and gives access to SWI calls. See the
  305. file Termio in the Perl library (Lib.Termio) for an example of its use.
  306.  
  307. The calling sequence for syscall() is
  308.  
  309.     $regs = syscall(SWI, $r0, $r1, ..., $r9);
  310.  
  311. Here, SWI is the SWI name or number (a string is looked up as a name,
  312. and a number is used directly). $r0 ... $r9 are passed to the registers
  313. to the SWI call. Only as many as are used need be passed. If $rn is a
  314. string, it is passed as a pointer to a 0-terminated string, otherwise it
  315. is passed as a number.
  316.  
  317. The result, $regs, is either the null string (if an error occurred,
  318. when $! gives the error number/message), or it is a packed string
  319. containing the return values of r0-r9. To get the actual registers,
  320. simply do
  321.  
  322.     ($r0, $r1, ..., $r9) = unpack('I9', $regs);
  323.  
  324. Clearly, in the normal case, a more specific unpack() template would be
  325. suitable.
  326.  
  327. Note that, due to Perl's tendency to treat numbers and strings as
  328. interchangeable, some care must be taken with parameters. For example,
  329.  
  330.     syscall("OS_Write0",$str);
  331.  
  332. can fail, if $str is assigned the string "0" - which may have been
  333. converted to numeric zero - as in this case Perl will assume you are
  334. passing a number, and set r0 to 0 instead of the address of the
  335. supplied string "0". To avoid this, make an explicit string - for
  336. example
  337.  
  338.     syscall("OS_Write0", $str . '');
  339.  
  340. is guaranteed to work. This is fairly obscure magic (deliberately
  341. invalidating the flag which says that the string has a valid numeric
  342. value, and then using the string before perl has a chance to notice that
  343. the numeric value is still OK), but works fine.
  344.  
  345. User subroutines
  346. ================
  347.  
  348. Using the "user supplied subroutine" facility, the following functions
  349. and variables are available in all Archimedes perl scripts.
  350.  
  351. $Mode            The current screen mode. This can be set.
  352. $Rows            The number of screen rows available.
  353. $Cols            The number of screen columns available.
  354.  
  355. &osrdch()        A single character string, read via OS_ReadC.
  356.  
  357. &oswrch($ch)        Writes the character $ch (an integer, which is the
  358.             ASCII code) using OS_WriteC. Returns 1 for success,
  359.             undef for failure.
  360.  
  361. &osrdstr($len,$lo,$hi)    Reads a string using OS_ReadLine. Uses an internal
  362.             buffer, $len characters long, to hold the input.
  363.             $lo and $hi are the lowest and highest ASCII codes
  364.             accepted (defaults 32 and 255 respectively).
  365.             Returns the input buffer.
  366.  
  367. &oswrstr($str)        Writes $str to the screen. Note that $str may contain
  368.             control characters, including nulls (for example,
  369.             &oswrstr("\026\000") changes to mode 0).
  370.             Returns 1 for success, undef for failure.
  371.  
  372. &fx($op,$x,$y)        Performs an OS_Byte call. Returns an integer
  373.             containing the resulting r1 in its bottom byte,
  374.             the resulting r2 in  its second byte, 1 in its
  375.             third byte if the carry flag is set, otherwise 0,
  376.             and 0 in its top byte.
  377.  
  378. Wishlist
  379. ========
  380.  
  381. More special file functions. Maybe settype(type,file...),
  382. settime(time,file...), etc. Maybe some more user functions...
  383.  
  384. Final Note
  385. ==========
  386.  
  387. Any suggestions for improvement to this port will be most gratefully
  388. received (particularly if they include the changes to the code!) I have
  389. found perl to be extremely useful for "simple" data manipulating tasks.
  390. See, for example, script NL in the Examples directory, which greatly
  391. aids the conversion of files from MS-DOS.
  392.  
  393. It is possible to make perl scripts executable by allocating a file
  394. type, and putting in your !Boot application (if you have a hard disk),
  395.  
  396.     *Set Alias$@RunType_xxx Perl %%0 %%*1
  397.     *Set File$Type_xxx Perl
  398.  
  399. The only thing this doesn't do is support command options which are
  400. always required, such as -P (preprocess using CC -E). But I don't use
  401. this much, anyway.
  402.  
  403. Have fun with perl!
  404.  
  405. Paul Moore.
  406.